library(elsasserlib)
library(ggpubr)
Loading required package: ggplot2
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
library(reshape)
library(dplyr)

Attaching package: ‘dplyr’

The following object is masked from ‘package:reshape’:

    rename

The following objects are masked from ‘package:stats’:

    filter, lag

The following objects are masked from ‘package:base’:

    intersect, setdiff, setequal, union
library(ggrepel)
tbl <- read.table('Kumar_2020_master_gene_table_rnaseq_shrunk_plus_annotations.tsv',sep = "\t",header = T)
tbl <- tbl[!duplicated(tbl$name),]
Warning: closing unused connection 3 (Kumar_2020_master_gene_table_rnaseq_shrunk_plus_annotations.tsv)
mdf <- select(tbl,"name","court_bivalent","RNASeq_DS_EZH2i_vs_Ni_baseMean","k27_bivalency_grp","H3K4m3_DS_EZH2i_vs_Ni_log2FoldChange")
mdf$k27_bivalency_grp<-as.factor(mdf$k27_bivalency_grp)

ggboxplot(mdf,x="k27_bivalency_grp",y="H3K4m3_DS_EZH2i_vs_Ni_log2FoldChange",fill="k27_bivalency_grp", add="median") + scale_y_continuous(limits=c(-5,5))
`fun.y` is deprecated. Use `fun` instead.`fun.ymin` is deprecated. Use `fun.min` instead.`fun.ymax` is deprecated. Use `fun.max` instead.

aggregate( H3K4m3_DS_EZH2i_vs_Ni_log2FoldChange ~ k27_bivalency_grp, mdf, FUN="median")

tbl <- read.table('Kumar_2020_master_gene_table_rnaseq_shrunk_plus_annotations.tsv',sep = "\t",header = T)
tbl <- tbl[!duplicated(tbl$name),]


tbl$sig_Ni_EZH2i_up <- (tbl$RNASeq_DS_EZH2i_vs_Ni_log2FoldChange > 0) & (tbl$RNASeq_DS_EZH2i_vs_Ni_padj < 0.05)
tbl$sig_Ni_EZH2i_down <- (tbl$RNASeq_DS_EZH2i_vs_Ni_log2FoldChange < -0) & (tbl$RNASeq_DS_EZH2i_vs_Ni_padj < 0.05)

tbl$Lanner_germlayer[tbl$name %in% c("MSX2")] <- "EarlyTE"
tbl$Lanner_germlayer[tbl$name %in% c("GATA2","GATA3","KRT7","XAGE2","NUAK2","EPAS1")] <- "TE"
tbl$Lanner_germlayer[tbl$name %in% c("VGLL1","CGB5")] <- "CTB"
tbl$Lanner_germlayer[tbl$name %in% c("SLC40A1","SDC1","CLDN4")] <- "STB"
tbl$sig_summary <- "ns"
tbl$sig_summary[tbl$sig_Ni_EZH2i_up] <- "Ni_EZH2i_up"
tbl$sig_summary[tbl$sig_Ni_EZH2i_down] <- "Ni_EZH2i_down"

lanner.set <- select(tbl[tbl$Lanner_germlayer != "None",], "name","Lanner_germlayer","sig_summary", contains("Log2FoldChange") & contains("RNASeq") )

lanner.set$Lanner_germlayer <- factor(lanner.set$Lanner_germlayer, levels= c("EightCells","Morula","ICM","EarlyBlastocyst","Early","EarlyEpi","Early/Mid Epi","MidEpi","LateEpi","PE","EarlyTE","TE","LateTE","CTB","STB","EVT","Amnion","YsMes","AxMes","AdvMes","NasMes","EmMes","Endoderm","PriS")
)

goi <- c("GATA3","GATA2","CDX2","TP63","CGA","CGB","CGB5","POU5F1","DPPA3","VGLL1","BMP4","VIM","DPPA2","NANOG","SOX2","KRT19","FGF4","TFAP2A","KRT7","ENPEP","IGF2","FRZB","ERP27","KRT23","DNMT3A","DNMT3L","XAGE2","HAND1","KRT18","KLF6","NUAK2","EPAS1","MSX2", "SDC1", "SLC40A1","CLDN4")

ggstripchart(lanner.set,x="Lanner_germlayer",y="RNASeq_DS_EZH2i_vs_Ni_log2FoldChange", 
             orientation="horizontal", 
             color = "sig_summary", 
             palette=c("#88AAFF","#EE8844","#DDDDDD"), 
             size = 1, jitter=0.2,
             ggtheme=theme_bw(),
             label="name", font.label = list(size = 7), repel=T, label.select = goi , label.rectangle = F) + scale_x_discrete(limits=rev)  

ggsave("lanner_germlayer_naive_strip.pdf")
Saving 6 x 6 in image

Intermediate population


EZH2i.tbl <- data.frame(name=tbl$name,lfc=tbl$RNASeq_DS_EZH2i_vs_Ni_log2FoldChange)

Messmer_tbl <- read.table("Messmer_CellRep2019_TableS2_IntermediatePop.tsv",header=T, sep="\t")
inter.tbl <- select(Messmer_tbl[Messmer_tbl$P.Value<0.0001 ,],"Gene","vsNaive")
colnames(inter.tbl) <- c("name","lfc")

inter.tbl <- inter.tbl[inter.tbl$name %in% EZH2i.tbl$name,]
inter.tbl <- inter.tbl[order(inter.tbl$lfc),]
#inter.tbl <- rbind(head(inter.tbl,50),tail(inter.tbl,50))

inter.down50 <- head(inter.tbl$name,50)
inter.up50 <- tail(inter.tbl$name,50)
inter.down25 <- head(inter.tbl$name,25)
inter.up25 <- tail(inter.tbl$name,25)

write.table(inter.down25,"Messmer_intermediate_down.top25.txt",sep="\t",quote=F,row.names=F,col.names=F)
write.table(inter.up25,"Messmer_intermediate_up.top25.txt",sep="\t",quote=F,row.names=F,col.names=F)
 
EZH2i.tbl <- EZH2i.tbl[EZH2i.tbl$name %in% inter.tbl$name,]

EZH2i.tbl$set <- "Ni_EZH2i" 
inter.tbl$set <- "Messmer_intermediate" 

mdf <- rbind(EZH2i.tbl,inter.tbl)
mdf$lfc <- mdf$lfc

cor.tbl <- cast(mdf,formula = name ~ set, value = "lfc")

ggscatter(cor.tbl <- cast(mdf,formula = name ~ set, value = "lfc")
,x="Ni_EZH2i",y="Messmer_intermediate", size=1, add = "reg.line", conf.int = TRUE) +  stat_cor(method = "pearson", label.x = 3) + scale_x_continuous(limits=c(-7,7)) + scale_y_continuous(limits=c(-7,7))


cor.tbl

cor.tbl$quantile <- cut(cor.tbl$Messmer_intermediate, 10, include.lowest=TRUE, labels = seq(1,10))


ggboxplot(cor.tbl,x = "quantile",y="Ni_EZH2i",fill = "quantile")


EZH2i.tbl <- data.frame(name=tbl$name,lfc=tbl$RNASeq_DS_EZH2i_vs_Ni_log2FoldChange)
inter_up.tbl <- EZH2i.tbl[EZH2i.tbl$name %in% inter.up50,]
inter_down.tbl <- EZH2i.tbl[EZH2i.tbl$name %in% inter.down50,]

inter_up.tbl$set <- "Intermediate"

ggscatter(test,x="Ni_EZH2i",y="Messmer_intermediate", size=1, add = "reg.line", conf.int = TRUE) +  stat_cor(method = "pearson", label.x = 3)
Error in ggscatter(test, x = "Ni_EZH2i", y = "Messmer_intermediate", size = 1,  : 
  object 'test' not found

inter.set <- select(tbl[tbl$name %in% inter.down50,], "Lanner_germlayer",contains("TPM") & contains("R1"))

mdf <- melt(inter.set)
Using Lanner_germlayer as id variables
mdf <- cbind(mdf,colsplit(mdf$variable,"_",c("RNASeq","TPM","state","treatment")))
number of columns of result is not a multiple of vector length (arg 51)
mdf$treatment <- gsub(mdf$treatment,pattern = "mean",replacement = "NT") 
mdf$sample <- paste0(mdf$state," ",mdf$treatment)
mdf$lg2 <- log2(mdf$value)

ggpaired(inter.set,cond1="RNASeq_TPM_Ni_R1",cond2="RNASeq_TPM_Ni_EZH2i_R1",fill = "condition") + scale_y_continuous(trans='log2')


inter.set <- select(tbl[tbl$name %in% inter.up50,], "Lanner_germlayer",contains("TPM") & contains("R1"))

mdf <- melt(inter.set)
Using Lanner_germlayer as id variables
mdf$value <- log2(mdf$value)

mdf <- cbind(mdf,colsplit(mdf$variable,"_",c("RNASeq","TPM","state","treatment")))
number of columns of result is not a multiple of vector length (arg 51)
mdf$treatment <- gsub(mdf$treatment,pattern = "mean",replacement = "NT") 
mdf$sample <- paste0(mdf$state," ",mdf$treatment)
mdf$lg2 <- log2(mdf$value)
NaNs produced
ggpaired(inter.set,cond1="RNASeq_TPM_Ni_R1",cond2="RNASeq_TPM_Ni_EZH2i_R1",fill = "condition") + scale_y_continuous(trans='log2')


Messmer_pop <- unlist(read.table(file = "Messmer_intermediate_top500.txt"))

inter.set <- select(tbl[tbl$name %in% Messmer_pop[1:50],], "Lanner_germlayer",contains("TPM") & contains("R1"))

mdf <- melt(inter.set)

mdf <- cbind(mdf,colsplit(mdf$variable,"_",c("RNASeq","TPM","state","treatment")))
mdf$treatment <- gsub(mdf$treatment,pattern = "mean",replacement = "NT") 
mdf$sample <- paste0(mdf$state," ",mdf$treatment)
mdf$lg2 <- log2(mdf$value)

ggpaired(inter.set,cond1="RNASeq_TPM_Ni_R1",cond2="RNASeq_TPM_Ni_EZH2i_R1",fill = "condition") + scale_y_continuous(trans='log2')

ggsave("pairplot_Messmer_interm.pdf")
ggboxplot(mdf,x="sample",y="lg2",fill="sample")

ggsave("boxplot_Messmer_interm.pdf")

Messmer_pop <- unlist(read.table(file = "Messmer_intermediate_top500.txt"))
KRT7_genes <- unlist(read.table('Zuchida2020_KRT7pop_genes.txt',sep = "\t",header = F))

inter.set <- select(tbl[tbl$name %in% inter.up25,], "Lanner_germlayer","name",contains("mean_cov"))

inter.set$K4K27ratio_Ni_mean_cov <- log2(inter.set$H3K4m3_Ni_mean_cov / inter.set$H3K27m3_Ni_mean_cov)
inter.set$K4K27ratio_Pr_mean_cov <- log2(inter.set$H3K4m3_Pr_mean_cov / inter.set$H3K27m3_Pr_mean_cov)

mdf <- melt(inter.set)
Using Lanner_germlayer, name as id variables
mdf <- cbind(mdf,colsplit(mdf$variable,"_",c("mark","state","treatment")))
number of columns of result is not a multiple of vector length (arg 26)
mdf$treatment <- gsub(mdf$treatment,pattern = "mean",replacement = "NT") 
mdf$sample <- paste0(mdf$state," ",mdf$treatment)

ggstripchart(mdf[mdf$mark=="H3K27m3",],x="sample",y="value",color="sample",label="name",repel=T)

ggstripchart(mdf,x="sample",y="value",fill="sample",add="boxplot",size=0.8,alpha=0.4,facet.by="dir")  + scale_y_continuous(trans="log2")

ggsave("Messmer_top50_RNASeq_boxplot.pdf")
Saving 6 x 6 in image
ggstripchart(mdf[mdf$state=="Ni",],x="sample",y="value",fill="sample",add="boxplot",size=0.8,alpha=0.4,facet.by="dir")  + scale_y_continuous(trans="log2")

ggsave("Messmer_top50_RNASeq_boxplot_Ni_only.pdf")
Saving 6 x 6 in image

inter.up50 <- unlist(read.table(file = "Messmer_intermediate_up.top50.txt"))
inter.down0 <- unlist(read.table(file = "Messmer_intermediate_down.top50.txt"))

inter.set.up <- select(tbl[tbl$name %in% inter.up50,], "Lanner_germlayer",contains("mean_cov"))
inter.set.down <- select(tbl[tbl$name %in% inter.down50,], "Lanner_germlayer",contains("mean_cov"))
inter.set.up$dir <- "up"
inter.set.down$dir <- "down"
inter.set <- rbind(inter.set.up,inter.set.down)

mdf <- melt(inter.set)
Using Lanner_germlayer, dir as id variables
mdf <- cbind(mdf,colsplit(mdf$variable,"_",c("mark","state","treatment")))
number of columns of result is not a multiple of vector length (arg 101)
mdf$treatment <- gsub(mdf$treatment,pattern = "mean",replacement = "NT") 
mdf$sample <- paste0(mdf$state," ",mdf$treatment)

mdf_updown <- mdf

ggpaired(inter.set,cond1="H3K27m3_Ni_mean_cov",cond2="H3K27m3_Pr_mean_cov",fill = "condition", facet.by = "dir")

ggstripchart(mdf[mdf$mark=="H3K27m3",],x="sample",y="value",fill="sample",add="boxplot",size=0.8,alpha=0.4,facet.by="dir")

ggsave("Messmer_top50_H3K27me3_boxplot.pdf")
Saving 6 x 6 in image
ggstripchart(mdf[mdf$mark=="H3K4m3",],x="sample",y="value",fill="sample",add="boxplot",size=0.8,alpha=0.4,facet.by="dir")

ggsave("Messmer_top50_H3K4me3_boxplot.pdf")
Saving 6 x 6 in image
ggstripchart(mdf[mdf$mark=="H2Aub",],x="sample",y="value",fill="sample",add="boxplot",size=0.8,alpha=0.4,facet.by="dir")

ggsave("Messmer_top50_H2Aub_boxplot.pdf")
Saving 6 x 6 in image


Messmer_pop <- unlist(read.table(file = "Messmer_intermediate_up.top50.txt"))

inter.set <- select(tbl[tbl$name %in% inter.down50,], "Lanner_germlayer",contains("mean_cov"))

inter.set$K4K27ratio_Ni_mean_cov <- log2(inter.set$H3K4m3_Ni_mean_cov / inter.set$H3K27m3_Ni_mean_cov)
inter.set$K4K27ratio_Pr_mean_cov <- log2(inter.set$H3K4m3_Pr_mean_cov / inter.set$H3K27m3_Pr_mean_cov)

mdf <- melt(inter.set)
Using Lanner_germlayer as id variables
mdf <- cbind(mdf,colsplit(mdf$variable,"_",c("mark","state","treatment")))
number of columns of result is not a multiple of vector length (arg 51)
mdf$treatment <- gsub(mdf$treatment,pattern = "mean",replacement = "NT") 
mdf$sample <- paste0(mdf$state," ",mdf$treatment)

ggpaired(inter.set,cond1="H3K27m3_Ni_mean_cov",cond2="H3K27m3_Pr_mean_cov",fill = "condition")

ggstripchart(mdf[mdf$mark=="H3K27m3",],x="sample",y="value",fill="sample",add="boxplot",size=0.8,alpha=0.4)

ggsave("Messmer_top50down_H3K27me3_boxplot.pdf")
Saving 6 x 6 in image
ggstripchart(mdf[mdf$mark=="H3K4m3",],x="sample",y="value",fill="sample",add="boxplot",size=0.8,alpha=0.4)

ggsave("Messmer_top50down_H3K4me3_boxplot.pdf")
Saving 6 x 6 in image
ggstripchart(mdf[mdf$mark=="H2Aub",],x="sample",y="value",fill="sample",add="boxplot",size=0.8,alpha=0.4)

ggsave("Messmer_top50down_H2Aub_boxplot.pdf")
Saving 6 x 6 in image

Messmer_pop <- unlist(read.table(file = "Messmer_intermediate_top500.txt"))

inter.set <- select(tbl[tbl$name %in% Messmer_pop[1:50],], "Lanner_germlayer",contains("TPM") & contains("R1"))

mdf <- melt(inter.set)

mdf <- cbind(mdf,colsplit(mdf$variable,"_",c("RNASeq","TPM","state","treatment")))
mdf$treatment <- gsub(mdf$treatment,pattern = "mean",replacement = "NT") 
mdf$sample <- paste0(mdf$state," ",mdf$treatment)
mdf$lg2 <- log2(mdf$value)

ggpaired(inter.set,cond1="RNASeq_TPM_Ni_R1",cond2="RNASeq_TPM_Ni_EZH2i_R1",fill = "condition") + scale_y_continuous(trans='log2')
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKCmBgYHtyfQpsaWJyYXJ5KGVsc2Fzc2VybGliKQpsaWJyYXJ5KGdncHVicikKbGlicmFyeShyZXNoYXBlKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGdncmVwZWwpCmBgYAoKYGBge3IgZmlnLndpZHRoPTIsIGZpZy5oZWlnaHQ9Mn0KdGJsIDwtIHJlYWQudGFibGUoJ0t1bWFyXzIwMjBfbWFzdGVyX2dlbmVfdGFibGVfcm5hc2VxX3NocnVua19wbHVzX2Fubm90YXRpb25zLnRzdicsc2VwID0gIlx0IixoZWFkZXIgPSBUKQp0YmwgPC0gdGJsWyFkdXBsaWNhdGVkKHRibCRuYW1lKSxdCgptZGYgPC0gc2VsZWN0KHRibCwibmFtZSIsImNvdXJ0X2JpdmFsZW50IiwiUk5BU2VxX0RTX0VaSDJpX3ZzX05pX2Jhc2VNZWFuIiwiazI3X2JpdmFsZW5jeV9ncnAiLCJIM0s0bTNfRFNfRVpIMmlfdnNfTmlfbG9nMkZvbGRDaGFuZ2UiKQptZGYkazI3X2JpdmFsZW5jeV9ncnA8LWFzLmZhY3RvcihtZGYkazI3X2JpdmFsZW5jeV9ncnApCgpnZ2JveHBsb3QobWRmLHg9ImsyN19iaXZhbGVuY3lfZ3JwIix5PSJIM0s0bTNfRFNfRVpIMmlfdnNfTmlfbG9nMkZvbGRDaGFuZ2UiLGZpbGw9ImsyN19iaXZhbGVuY3lfZ3JwIiwgYWRkPSJtZWRpYW4iKSArIHNjYWxlX3lfY29udGludW91cyhsaW1pdHM9YygtNSw1KSkKCmFnZ3JlZ2F0ZSggSDNLNG0zX0RTX0VaSDJpX3ZzX05pX2xvZzJGb2xkQ2hhbmdlIH4gazI3X2JpdmFsZW5jeV9ncnAsIG1kZiwgRlVOPSJtZWRpYW4iKQpgYGAKCmBgYHtyIGZpZy53aWR0aD01LCBmaWcuaGVpZ2h0PTV9CgptZGYgPC0gc2VsZWN0KHRibCwibmFtZSIsImNvdXJ0X2JpdmFsZW50IiwiUk5BU2VxX1RQTV9OaV9SMSIsImsyN19iaXZhbGVuY3lfZ3JwIiwiSDNLNG0zX0RTX0VaSDJpX3ZzX05pX2xvZzJGb2xkQ2hhbmdlIiwiSDNLNG0zX0RTX0VaSDJpX3ZzX05pX2Jhc2VNZWFuIikKCmdnc2NhdHRlcihtZGYseD0iUk5BU2VxX1RQTV9OaV9SMSIseT0iSDNLNG0zX0RTX0VaSDJpX3ZzX05pX2xvZzJGb2xkQ2hhbmdlIixzaXplPTEsYWxwaGE9MC4xLGNvbG9yPSJrMjdfYml2YWxlbmN5X2dycCIpICsgc2NhbGVfeF9jb250aW51b3VzKHRyYW5zPSJsb2cyIikgKyBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzPWMoLTUsNSkpCgpnZ3NjYXR0ZXIobWRmLHg9IlJOQVNlcV9UUE1fTmlfUjEiLHk9IkgzSzRtM19EU19FWkgyaV92c19OaV9iYXNlTWVhbiIsc2l6ZT0xLGFscGhhPTAuMSxjb2xvcj0iazI3X2JpdmFsZW5jeV9ncnAiKSArIHNjYWxlX3hfY29udGludW91cyh0cmFucz0ibG9nMiIpICsgc2NhbGVfeV9jb250aW51b3VzKHRyYW5zPSJsb2cyIikKCmBgYAoKYGBge3IgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9OH0KCmdncGFpcmVkKGxhbm5lci5zZXQsY29uZDE9IlJOQVNlcV9UUE1fTmlfUjEiLGNvbmQyPSJSTkFTZXFfVFBNX05pX0VaSDJpX1IxIixmYWNldC5ieSA9ICJMYW5uZXJfZ2VybWxheWVyIixmaWxsID0gImNvbmRpdGlvbiIpICsgc2NhbGVfeV9jb250aW51b3VzKHRyYW5zPSdsb2cyJykKZ2dzYXZlKCJwYWlycGxvdF9STkFTZXEucGRmIikKYGBgCgojIyBJbnRlcm1lZGlhdGUgcG9wdWxhdGlvbgoKYGBge3IgZmlnLndpZHRoPTUsIGZpZy5oZWlnaHQ9NX0KCkVaSDJpLnRibCA8LSBkYXRhLmZyYW1lKG5hbWU9dGJsJG5hbWUsbGZjPXRibCRSTkFTZXFfRFNfRVpIMmlfdnNfTmlfbG9nMkZvbGRDaGFuZ2UpCgpNZXNzbWVyX3RibCA8LSByZWFkLnRhYmxlKCJNZXNzbWVyX0NlbGxSZXAyMDE5X1RhYmxlUzJfSW50ZXJtZWRpYXRlUG9wLnRzdiIsaGVhZGVyPVQsIHNlcD0iXHQiKQppbnRlci50YmwgPC0gc2VsZWN0KE1lc3NtZXJfdGJsW01lc3NtZXJfdGJsJFAuVmFsdWU8MC4wMDAxICxdLCJHZW5lIiwidnNOYWl2ZSIpCmNvbG5hbWVzKGludGVyLnRibCkgPC0gYygibmFtZSIsImxmYyIpCgppbnRlci50YmwgPC0gaW50ZXIudGJsW2ludGVyLnRibCRuYW1lICVpbiUgRVpIMmkudGJsJG5hbWUsXQppbnRlci50YmwgPC0gaW50ZXIudGJsW29yZGVyKGludGVyLnRibCRsZmMpLF0KI2ludGVyLnRibCA8LSByYmluZChoZWFkKGludGVyLnRibCw1MCksdGFpbChpbnRlci50YmwsNTApKQoKaW50ZXIuZG93bjUwIDwtIGhlYWQoaW50ZXIudGJsJG5hbWUsNTApCmludGVyLnVwNTAgPC0gdGFpbChpbnRlci50YmwkbmFtZSw1MCkKaW50ZXIuZG93bjI1IDwtIGhlYWQoaW50ZXIudGJsJG5hbWUsMjUpCmludGVyLnVwMjUgPC0gdGFpbChpbnRlci50YmwkbmFtZSwyNSkKCndyaXRlLnRhYmxlKGludGVyLmRvd24yNSwiTWVzc21lcl9pbnRlcm1lZGlhdGVfZG93bi50b3AyNS50eHQiLHNlcD0iXHQiLHF1b3RlPUYscm93Lm5hbWVzPUYsY29sLm5hbWVzPUYpCndyaXRlLnRhYmxlKGludGVyLnVwMjUsIk1lc3NtZXJfaW50ZXJtZWRpYXRlX3VwLnRvcDI1LnR4dCIsc2VwPSJcdCIscXVvdGU9Rixyb3cubmFtZXM9Rixjb2wubmFtZXM9RikKIApFWkgyaS50YmwgPC0gRVpIMmkudGJsW0VaSDJpLnRibCRuYW1lICVpbiUgaW50ZXIudGJsJG5hbWUsXQoKRVpIMmkudGJsJHNldCA8LSAiTmlfRVpIMmkiIAppbnRlci50Ymwkc2V0IDwtICJNZXNzbWVyX2ludGVybWVkaWF0ZSIgCgptZGYgPC0gcmJpbmQoRVpIMmkudGJsLGludGVyLnRibCkKbWRmJGxmYyA8LSBtZGYkbGZjCgpjb3IudGJsIDwtIGNhc3QobWRmLGZvcm11bGEgPSBuYW1lIH4gc2V0LCB2YWx1ZSA9ICJsZmMiKQoKZ2dzY2F0dGVyKGNvci50YmwgPC0gY2FzdChtZGYsZm9ybXVsYSA9IG5hbWUgfiBzZXQsIHZhbHVlID0gImxmYyIpCix4PSJOaV9FWkgyaSIseT0iTWVzc21lcl9pbnRlcm1lZGlhdGUiLCBzaXplPTEsIGFkZCA9ICJyZWcubGluZSIsIGNvbmYuaW50ID0gVFJVRSkgKyAgc3RhdF9jb3IobWV0aG9kID0gInBlYXJzb24iLCBsYWJlbC54ID0gMykgKyBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzPWMoLTcsNykpICsgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cz1jKC03LDcpKQpgYGAKCmBgYHtyIGZpZy53aWR0aD0zLCBmaWcuaGVpZ2h0PTN9Cgpjb3IudGJsCgpjb3IudGJsJHF1YW50aWxlIDwtIGN1dChjb3IudGJsJE1lc3NtZXJfaW50ZXJtZWRpYXRlLCAxMCwgaW5jbHVkZS5sb3dlc3Q9VFJVRSwgbGFiZWxzID0gc2VxKDEsMTApKQoKCmdnYm94cGxvdChjb3IudGJsLHggPSAicXVhbnRpbGUiLHk9Ik5pX0VaSDJpIixmaWxsID0gInF1YW50aWxlIikKYGBgCgoKYGBge3IgZmlnLndpZHRoPTMsIGZpZy5oZWlnaHQ9M30KCkVaSDJpLnRibCA8LSBkYXRhLmZyYW1lKG5hbWU9dGJsJG5hbWUsbGZjPXRibCRSTkFTZXFfRFNfRVpIMmlfdnNfTmlfbG9nMkZvbGRDaGFuZ2UpCmludGVyX3VwLnRibCA8LSBFWkgyaS50YmxbRVpIMmkudGJsJG5hbWUgJWluJSBpbnRlci51cDUwLF0KaW50ZXJfZG93bi50YmwgPC0gRVpIMmkudGJsW0VaSDJpLnRibCRuYW1lICVpbiUgaW50ZXIuZG93bjUwLF0KCmludGVyX3VwLnRibCRzZXQgPC0gIkludGVybWVkaWF0ZSIKCmdnc2NhdHRlcih0ZXN0LHg9Ik5pX0VaSDJpIix5PSJNZXNzbWVyX2ludGVybWVkaWF0ZSIsIHNpemU9MSwgYWRkID0gInJlZy5saW5lIiwgY29uZi5pbnQgPSBUUlVFKSArICBzdGF0X2NvcihtZXRob2QgPSAicGVhcnNvbiIsIGxhYmVsLnggPSAzKQpgYGAKCmBgYHtyIGZpZy53aWR0aD0zLCBmaWcuaGVpZ2h0PTN9CgppbnRlci5zZXQgPC0gc2VsZWN0KHRibFt0YmwkbmFtZSAlaW4lIGludGVyLmRvd241MCxdLCAiTGFubmVyX2dlcm1sYXllciIsY29udGFpbnMoIlRQTSIpICYgY29udGFpbnMoIlIxIikpCgptZGYgPC0gbWVsdChpbnRlci5zZXQpCgptZGYgPC0gY2JpbmQobWRmLGNvbHNwbGl0KG1kZiR2YXJpYWJsZSwiXyIsYygiUk5BU2VxIiwiVFBNIiwic3RhdGUiLCJ0cmVhdG1lbnQiKSkpCm1kZiR0cmVhdG1lbnQgPC0gZ3N1YihtZGYkdHJlYXRtZW50LHBhdHRlcm4gPSAibWVhbiIscmVwbGFjZW1lbnQgPSAiTlQiKSAKbWRmJHNhbXBsZSA8LSBwYXN0ZTAobWRmJHN0YXRlLCIgIixtZGYkdHJlYXRtZW50KQptZGYkbGcyIDwtIGxvZzIobWRmJHZhbHVlKQoKZ2dwYWlyZWQoaW50ZXIuc2V0LGNvbmQxPSJSTkFTZXFfVFBNX05pX1IxIixjb25kMj0iUk5BU2VxX1RQTV9OaV9FWkgyaV9SMSIsZmlsbCA9ICJjb25kaXRpb24iKSArIHNjYWxlX3lfY29udGludW91cyh0cmFucz0nbG9nMicpCmBgYApgYGB7ciBmaWcud2lkdGg9MywgZmlnLmhlaWdodD0zfQoKaW50ZXIuc2V0IDwtIHNlbGVjdCh0YmxbdGJsJG5hbWUgJWluJSBpbnRlci51cDUwLF0sICJMYW5uZXJfZ2VybWxheWVyIixjb250YWlucygiVFBNIikgJiBjb250YWlucygiUjEiKSkKCm1kZiA8LSBtZWx0KGludGVyLnNldCkKbWRmJHZhbHVlIDwtIGxvZzIobWRmJHZhbHVlKQoKbWRmIDwtIGNiaW5kKG1kZixjb2xzcGxpdChtZGYkdmFyaWFibGUsIl8iLGMoIlJOQVNlcSIsIlRQTSIsInN0YXRlIiwidHJlYXRtZW50IikpKQptZGYkdHJlYXRtZW50IDwtIGdzdWIobWRmJHRyZWF0bWVudCxwYXR0ZXJuID0gIm1lYW4iLHJlcGxhY2VtZW50ID0gIk5UIikgCm1kZiRzYW1wbGUgPC0gcGFzdGUwKG1kZiRzdGF0ZSwiICIsbWRmJHRyZWF0bWVudCkKbWRmJGxnMiA8LSBsb2cyKG1kZiR2YWx1ZSkKCmdncGFpcmVkKGludGVyLnNldCxjb25kMT0iUk5BU2VxX1RQTV9OaV9SMSIsY29uZDI9IlJOQVNlcV9UUE1fTmlfRVpIMmlfUjEiLGZpbGwgPSAiY29uZGl0aW9uIikgKyBzY2FsZV95X2NvbnRpbnVvdXModHJhbnM9J2xvZzInKQpgYGAKCmBgYHtyIGZpZy53aWR0aD0zLCBmaWcuaGVpZ2h0PTN9CgpNZXNzbWVyX3BvcCA8LSB1bmxpc3QocmVhZC50YWJsZShmaWxlID0gIk1lc3NtZXJfaW50ZXJtZWRpYXRlX3RvcDUwMC50eHQiKSkKCmludGVyLnNldCA8LSBzZWxlY3QodGJsW3RibCRuYW1lICVpbiUgTWVzc21lcl9wb3BbMTo1MF0sXSwgIkxhbm5lcl9nZXJtbGF5ZXIiLGNvbnRhaW5zKCJUUE0iKSAmIGNvbnRhaW5zKCJSMSIpKQoKbWRmIDwtIG1lbHQoaW50ZXIuc2V0KQoKbWRmIDwtIGNiaW5kKG1kZixjb2xzcGxpdChtZGYkdmFyaWFibGUsIl8iLGMoIlJOQVNlcSIsIlRQTSIsInN0YXRlIiwidHJlYXRtZW50IikpKQptZGYkdHJlYXRtZW50IDwtIGdzdWIobWRmJHRyZWF0bWVudCxwYXR0ZXJuID0gIm1lYW4iLHJlcGxhY2VtZW50ID0gIk5UIikgCm1kZiRzYW1wbGUgPC0gcGFzdGUwKG1kZiRzdGF0ZSwiICIsbWRmJHRyZWF0bWVudCkKbWRmJGxnMiA8LSBsb2cyKG1kZiR2YWx1ZSkKCmdncGFpcmVkKGludGVyLnNldCxjb25kMT0iUk5BU2VxX1RQTV9OaV9SMSIsY29uZDI9IlJOQVNlcV9UUE1fTmlfRVpIMmlfUjEiLGZpbGwgPSAiY29uZGl0aW9uIikgKyBzY2FsZV95X2NvbnRpbnVvdXModHJhbnM9J2xvZzInKQpgYGAKCmBgYHtyIGZpZy53aWR0aD0yLCBmaWcuaGVpZ2h0PTJ9CgpnZ3NhdmUoInBhaXJwbG90X01lc3NtZXJfaW50ZXJtLnBkZiIpCmdnYm94cGxvdChtZGYseD0ic2FtcGxlIix5PSJsZzIiLGZpbGw9InNhbXBsZSIpCgpnZ3NhdmUoImJveHBsb3RfTWVzc21lcl9pbnRlcm0ucGRmIikKYGBgCgpgYGB7ciBmaWcud2lkdGg9NSwgZmlnLmhlaWdodD01fQoKTWVzc21lcl9wb3AgPC0gdW5saXN0KHJlYWQudGFibGUoZmlsZSA9ICJNZXNzbWVyX2ludGVybWVkaWF0ZV90b3A1MDAudHh0IikpCktSVDdfZ2VuZXMgPC0gdW5saXN0KHJlYWQudGFibGUoJ1p1Y2hpZGEyMDIwX0tSVDdwb3BfZ2VuZXMudHh0JyxzZXAgPSAiXHQiLGhlYWRlciA9IEYpKQoKaW50ZXIuc2V0IDwtIHNlbGVjdCh0YmxbdGJsJG5hbWUgJWluJSBpbnRlci51cDI1LF0sICJMYW5uZXJfZ2VybWxheWVyIiwibmFtZSIsY29udGFpbnMoIm1lYW5fY292IikpCgppbnRlci5zZXQkSzRLMjdyYXRpb19OaV9tZWFuX2NvdiA8LSBsb2cyKGludGVyLnNldCRIM0s0bTNfTmlfbWVhbl9jb3YgLyBpbnRlci5zZXQkSDNLMjdtM19OaV9tZWFuX2NvdikKaW50ZXIuc2V0JEs0SzI3cmF0aW9fUHJfbWVhbl9jb3YgPC0gbG9nMihpbnRlci5zZXQkSDNLNG0zX1ByX21lYW5fY292IC8gaW50ZXIuc2V0JEgzSzI3bTNfUHJfbWVhbl9jb3YpCgptZGYgPC0gbWVsdChpbnRlci5zZXQpCgptZGYgPC0gY2JpbmQobWRmLGNvbHNwbGl0KG1kZiR2YXJpYWJsZSwiXyIsYygibWFyayIsInN0YXRlIiwidHJlYXRtZW50IikpKQptZGYkdHJlYXRtZW50IDwtIGdzdWIobWRmJHRyZWF0bWVudCxwYXR0ZXJuID0gIm1lYW4iLHJlcGxhY2VtZW50ID0gIk5UIikgCm1kZiRzYW1wbGUgPC0gcGFzdGUwKG1kZiRzdGF0ZSwiICIsbWRmJHRyZWF0bWVudCkKCmdnc3RyaXBjaGFydChtZGZbbWRmJG1hcms9PSJIM0syN20zIixdLHg9InNhbXBsZSIseT0idmFsdWUiLGNvbG9yPSJzYW1wbGUiLGxhYmVsPSJuYW1lIixyZXBlbD1UKQpgYGAKCmBgYHtyIGZpZy53aWR0aD0zLCBmaWcuaGVpZ2h0PTN9CgppbnRlci51cDUwIDwtIHVubGlzdChyZWFkLnRhYmxlKGZpbGUgPSAiTWVzc21lcl9pbnRlcm1lZGlhdGVfdXAudG9wNTAudHh0IikpCmludGVyLmRvd24wIDwtIHVubGlzdChyZWFkLnRhYmxlKGZpbGUgPSAiTWVzc21lcl9pbnRlcm1lZGlhdGVfZG93bi50b3A1MC50eHQiKSkKCmludGVyLnNldC51cCA8LSBzZWxlY3QodGJsW3RibCRuYW1lICVpbiUgaW50ZXIudXA1MCxdLCAibmFtZSIsIkxhbm5lcl9nZXJtbGF5ZXIiLGNvbnRhaW5zKCJUUE0iKSAmIGNvbnRhaW5zKCJSMSIpKQppbnRlci5zZXQuZG93biA8LSBzZWxlY3QodGJsW3RibCRuYW1lICVpbiUgaW50ZXIuZG93bjUwLF0sICJuYW1lIiwiTGFubmVyX2dlcm1sYXllciIsY29udGFpbnMoIlRQTSIpICYgY29udGFpbnMoIlIxIikpCmludGVyLnNldC51cCRkaXIgPC0gInVwIgppbnRlci5zZXQuZG93biRkaXIgPC0gImRvd24iCmludGVyLnNldCA8LSByYmluZChpbnRlci5zZXQudXAsaW50ZXIuc2V0LmRvd24pCgptZGYgPC0gbWVsdChpbnRlci5zZXQpCgptZGYgPC0gY2JpbmQobWRmLGNvbHNwbGl0KG1kZiR2YXJpYWJsZSwiXyIsYygiUk5BU2VxIiwiVFBNIiwic3RhdGUiLCJ0cmVhdG1lbnQiKSkpCm1kZiR0cmVhdG1lbnQgPC0gZ3N1YihtZGYkdHJlYXRtZW50LHBhdHRlcm4gPSAiUjEiLHJlcGxhY2VtZW50ID0gIk5UIikgCm1kZiRzYW1wbGUgPC0gcGFzdGUwKG1kZiRzdGF0ZSwiICIsbWRmJHRyZWF0bWVudCkKCmdncGFpcmVkKGludGVyLnNldCxjb25kMT0iUk5BU2VxX1RQTV9OaV9SMSIsY29uZDI9IlJOQVNlcV9UUE1fTmlfRVpIMmlfUjEiLGZpbGwgPSAiY29uZGl0aW9uIiwgZmFjZXQuYnkgPSAiZGlyIiwgbGFiZWw9Im5hbWUiLCBsYWJlbC5zZWxlY3QgPSBjKCJHQVRBMyIsIktSVDE5IikpICsgc2NhbGVfeV9jb250aW51b3VzKHRyYW5zPSJsb2cyIikKZ2dzYXZlKCJNZXNzbWVyX3RvcDUwX1JOQVNlcV9wYWlyZWRfTmlfb25seS5wZGYiKQpgYGAKCmBgYHtyIGZpZy53aWR0aD0zLCBmaWcuaGVpZ2h0PTN9Cmdnc3RyaXBjaGFydChtZGYseD0ic2FtcGxlIix5PSJ2YWx1ZSIsZmlsbD0ic2FtcGxlIixhZGQ9ImJveHBsb3QiLHNpemU9MC44LGFscGhhPTAuNCxmYWNldC5ieT0iZGlyIikgICsgc2NhbGVfeV9jb250aW51b3VzKHRyYW5zPSJsb2cyIikKZ2dzYXZlKCJNZXNzbWVyX3RvcDUwX1JOQVNlcV9ib3hwbG90LnBkZiIpCmBgYApgYGB7ciBmaWcud2lkdGg9MywgZmlnLmhlaWdodD0zfQpnZ3N0cmlwY2hhcnQobWRmW21kZiRzdGF0ZT09Ik5pIixdLHg9InNhbXBsZSIseT0idmFsdWUiLGZpbGw9InNhbXBsZSIsYWRkPSJib3hwbG90IixzaXplPTAuOCxhbHBoYT0wLjQsZmFjZXQuYnk9ImRpciIpICArIHNjYWxlX3lfY29udGludW91cyh0cmFucz0ibG9nMiIpCmdnc2F2ZSgiTWVzc21lcl90b3A1MF9STkFTZXFfYm94cGxvdF9OaV9vbmx5LnBkZiIpCmBgYAoKYGBge3IgZmlnLndpZHRoPTMsIGZpZy5oZWlnaHQ9M30KCmludGVyLnVwNTAgPC0gdW5saXN0KHJlYWQudGFibGUoZmlsZSA9ICJNZXNzbWVyX2ludGVybWVkaWF0ZV91cC50b3A1MC50eHQiKSkKaW50ZXIuZG93bjAgPC0gdW5saXN0KHJlYWQudGFibGUoZmlsZSA9ICJNZXNzbWVyX2ludGVybWVkaWF0ZV9kb3duLnRvcDUwLnR4dCIpKQoKaW50ZXIuc2V0LnVwIDwtIHNlbGVjdCh0YmxbdGJsJG5hbWUgJWluJSBpbnRlci51cDUwLF0sICJMYW5uZXJfZ2VybWxheWVyIixjb250YWlucygibWVhbl9jb3YiKSkKaW50ZXIuc2V0LmRvd24gPC0gc2VsZWN0KHRibFt0YmwkbmFtZSAlaW4lIGludGVyLmRvd241MCxdLCAiTGFubmVyX2dlcm1sYXllciIsY29udGFpbnMoIm1lYW5fY292IikpCmludGVyLnNldC51cCRkaXIgPC0gInVwIgppbnRlci5zZXQuZG93biRkaXIgPC0gImRvd24iCmludGVyLnNldCA8LSByYmluZChpbnRlci5zZXQudXAsaW50ZXIuc2V0LmRvd24pCgptZGYgPC0gbWVsdChpbnRlci5zZXQpCgptZGYgPC0gY2JpbmQobWRmLGNvbHNwbGl0KG1kZiR2YXJpYWJsZSwiXyIsYygibWFyayIsInN0YXRlIiwidHJlYXRtZW50IikpKQptZGYkdHJlYXRtZW50IDwtIGdzdWIobWRmJHRyZWF0bWVudCxwYXR0ZXJuID0gIm1lYW4iLHJlcGxhY2VtZW50ID0gIk5UIikgCm1kZiRzYW1wbGUgPC0gcGFzdGUwKG1kZiRzdGF0ZSwiICIsbWRmJHRyZWF0bWVudCkKCmdncGFpcmVkKGludGVyLnNldCxjb25kMT0iSDNLMjdtM19OaV9tZWFuX2NvdiIsY29uZDI9IkgzSzI3bTNfUHJfbWVhbl9jb3YiLGZpbGwgPSAiY29uZGl0aW9uIiwgZmFjZXQuYnkgPSAiZGlyIikKYGBgCgpgYGB7ciBmaWcud2lkdGg9MywgZmlnLmhlaWdodD0zfQpnZ3N0cmlwY2hhcnQobWRmW21kZiRtYXJrPT0iSDNLMjdtMyIsXSx4PSJzYW1wbGUiLHk9InZhbHVlIixmaWxsPSJzYW1wbGUiLGFkZD0iYm94cGxvdCIsc2l6ZT0wLjgsYWxwaGE9MC40LGZhY2V0LmJ5PSJkaXIiKQpnZ3NhdmUoIk1lc3NtZXJfdG9wNTBfSDNLMjdtZTNfYm94cGxvdC5wZGYiKQpgYGAKYGBge3IgZmlnLndpZHRoPTMsIGZpZy5oZWlnaHQ9M30KZ2dzdHJpcGNoYXJ0KG1kZlttZGYkbWFyaz09IkgzSzRtMyIsXSx4PSJzYW1wbGUiLHk9InZhbHVlIixmaWxsPSJzYW1wbGUiLGFkZD0iYm94cGxvdCIsc2l6ZT0wLjgsYWxwaGE9MC40LGZhY2V0LmJ5PSJkaXIiKQpnZ3NhdmUoIk1lc3NtZXJfdG9wNTBfSDNLNG1lM19ib3hwbG90LnBkZiIpCmBgYAoKYGBge3IgZmlnLndpZHRoPTMsIGZpZy5oZWlnaHQ9M30KZ2dzdHJpcGNoYXJ0KG1kZlttZGYkbWFyaz09IkgyQXViIixdLHg9InNhbXBsZSIseT0idmFsdWUiLGZpbGw9InNhbXBsZSIsYWRkPSJib3hwbG90IixzaXplPTAuOCxhbHBoYT0wLjQsZmFjZXQuYnk9ImRpciIpCmdnc2F2ZSgiTWVzc21lcl90b3A1MF9IMkF1Yl9ib3hwbG90LnBkZiIpCmBgYApgYGB7ciBmaWcud2lkdGg9MywgZmlnLmhlaWdodD0zfQoKZ2dzY2F0dGVyKGludGVyLnNldCx4PSJIM0syN20zX05pX21lYW5fY292Iix5PSJIM0s0bTNfTmlfbWVhbl9jb3YiLGNvbG9yPSJkaXIiLHNpemU9MC44LGFscGhhPTAuNCkKYGBgCgpgYGB7ciBmaWcud2lkdGg9MywgZmlnLmhlaWdodD0zfQoKTWVzc21lcl9wb3AgPC0gdW5saXN0KHJlYWQudGFibGUoZmlsZSA9ICJNZXNzbWVyX2ludGVybWVkaWF0ZV91cC50b3A1MC50eHQiKSkKCmludGVyLnNldCA8LSBzZWxlY3QodGJsW3RibCRuYW1lICVpbiUgaW50ZXIuZG93bjUwLF0sICJMYW5uZXJfZ2VybWxheWVyIixjb250YWlucygibWVhbl9jb3YiKSkKCmludGVyLnNldCRLNEsyN3JhdGlvX05pX21lYW5fY292IDwtIGxvZzIoaW50ZXIuc2V0JEgzSzRtM19OaV9tZWFuX2NvdiAvIGludGVyLnNldCRIM0syN20zX05pX21lYW5fY292KQppbnRlci5zZXQkSzRLMjdyYXRpb19Qcl9tZWFuX2NvdiA8LSBsb2cyKGludGVyLnNldCRIM0s0bTNfUHJfbWVhbl9jb3YgLyBpbnRlci5zZXQkSDNLMjdtM19Qcl9tZWFuX2NvdikKCm1kZiA8LSBtZWx0KGludGVyLnNldCkKCm1kZiA8LSBjYmluZChtZGYsY29sc3BsaXQobWRmJHZhcmlhYmxlLCJfIixjKCJtYXJrIiwic3RhdGUiLCJ0cmVhdG1lbnQiKSkpCm1kZiR0cmVhdG1lbnQgPC0gZ3N1YihtZGYkdHJlYXRtZW50LHBhdHRlcm4gPSAibWVhbiIscmVwbGFjZW1lbnQgPSAiTlQiKSAKbWRmJHNhbXBsZSA8LSBwYXN0ZTAobWRmJHN0YXRlLCIgIixtZGYkdHJlYXRtZW50KQoKZ2dwYWlyZWQoaW50ZXIuc2V0LGNvbmQxPSJIM0syN20zX05pX21lYW5fY292Iixjb25kMj0iSDNLMjdtM19Qcl9tZWFuX2NvdiIsZmlsbCA9ICJjb25kaXRpb24iKQpgYGAKYGBge3IgZmlnLndpZHRoPTMsIGZpZy5oZWlnaHQ9M30KZ2dzdHJpcGNoYXJ0KG1kZlttZGYkbWFyaz09IkgzSzI3bTMiLF0seD0ic2FtcGxlIix5PSJ2YWx1ZSIsZmlsbD0ic2FtcGxlIixhZGQ9ImJveHBsb3QiLHNpemU9MC44LGFscGhhPTAuNCkKZ2dzYXZlKCJNZXNzbWVyX3RvcDUwZG93bl9IM0syN21lM19ib3hwbG90LnBkZiIpCmBgYAoKYGBge3IgZmlnLndpZHRoPTMsIGZpZy5oZWlnaHQ9M30KZ2dzdHJpcGNoYXJ0KG1kZlttZGYkbWFyaz09IkgzSzRtMyIsXSx4PSJzYW1wbGUiLHk9InZhbHVlIixmaWxsPSJzYW1wbGUiLGFkZD0iYm94cGxvdCIsc2l6ZT0wLjgsYWxwaGE9MC40KQpnZ3NhdmUoIk1lc3NtZXJfdG9wNTBkb3duX0gzSzRtZTNfYm94cGxvdC5wZGYiKQpgYGAKCmBgYHtyIGZpZy53aWR0aD0zLCBmaWcuaGVpZ2h0PTN9Cmdnc3RyaXBjaGFydChtZGZbbWRmJG1hcms9PSJIMkF1YiIsXSx4PSJzYW1wbGUiLHk9InZhbHVlIixmaWxsPSJzYW1wbGUiLGFkZD0iYm94cGxvdCIsc2l6ZT0wLjgsYWxwaGE9MC40KQpnZ3NhdmUoIk1lc3NtZXJfdG9wNTBkb3duX0gyQXViX2JveHBsb3QucGRmIikKYGBgCgoKYGBge3IgZmlnLndpZHRoPTMsIGZpZy5oZWlnaHQ9M30KCk1lc3NtZXJfcG9wIDwtIHVubGlzdChyZWFkLnRhYmxlKGZpbGUgPSAiTWVzc21lcl9pbnRlcm1lZGlhdGVfdG9wNTAwLnR4dCIpKQoKaW50ZXIuc2V0IDwtIHNlbGVjdCh0YmxbdGJsJG5hbWUgJWluJSBNZXNzbWVyX3BvcFsxOjUwXSxdLCAiTGFubmVyX2dlcm1sYXllciIsY29udGFpbnMoIlRQTSIpICYgY29udGFpbnMoIlIxIikpCgptZGYgPC0gbWVsdChpbnRlci5zZXQpCgptZGYgPC0gY2JpbmQobWRmLGNvbHNwbGl0KG1kZiR2YXJpYWJsZSwiXyIsYygiUk5BU2VxIiwiVFBNIiwic3RhdGUiLCJ0cmVhdG1lbnQiKSkpCm1kZiR0cmVhdG1lbnQgPC0gZ3N1YihtZGYkdHJlYXRtZW50LHBhdHRlcm4gPSAibWVhbiIscmVwbGFjZW1lbnQgPSAiTlQiKSAKbWRmJHNhbXBsZSA8LSBwYXN0ZTAobWRmJHN0YXRlLCIgIixtZGYkdHJlYXRtZW50KQptZGYkbGcyIDwtIGxvZzIobWRmJHZhbHVlKQoKZ2dwYWlyZWQoaW50ZXIuc2V0LGNvbmQxPSJSTkFTZXFfVFBNX05pX1IxIixjb25kMj0iUk5BU2VxX1RQTV9OaV9FWkgyaV9SMSIsZmlsbCA9ICJjb25kaXRpb24iKSArIHNjYWxlX3lfY29udGludW91cyh0cmFucz0nbG9nMicpCmBgYA==